import WebGLDebugUtils from 'webgl-debug';
function throwOnGLError(err: any, funcName: string, args: any) {
    throw new Error(WebGLDebugUtils.glEnumToString(err) + 'was caused by call to ' + funcName);
};


export function createGLContext(div: string) {

    if (!window.WebGLRenderingContext) {

        throw new Error('浏览器不支持webgl')
    }
    const t = document.getElementById(div);
    if (!t) {
        throw new Error('挂载点不存在')
    }

    const canvas = document.createElement('canvas');
    t.appendChild(canvas)
    let context: I.IWebGLRenderingContext | null = null;
    try {
        // context = (canvas.getContext('webgl') as I.IWebGLRenderingContext);
        context = <I.IWebGLRenderingContext>canvas.getContext('webgl');
        if (context) {
            context.viewportWidth = canvas.width;
            context.viewportHeight = canvas.height;
        }
    } catch (e) {
        console.error(e);
        throw new Error('Failed to create WebGL context!')
    }
    return WebGLDebugUtils.makeDebugContext(context, throwOnGLError);
    // var names = ["webgl", "experimental-webgl"];
    // var context: null | WebGLRenderingContext | WebGL2RenderingContext | CanvasRenderingContext2D | ImageBitmapRenderingContext = null;
    // for (const n of names) {
    //     try {
    //         context = canvas.getContext(n);
    //     } catch (e) {
    //         console.error(e)
    //         alert("Failed to create WebGL context!");
    //     }
    //     if (context) {
    //         context.viewportWidth = canvas.width;
    //         context.viewportHeight = canvas.height;
    //         break;
    //     } else {
    //         alert("Failed to create WebGL context!");
    //         return context;
    //     }
    // }


}

export function loadShader(gl: WebGLRenderingContext, type: number, shaderSource: string) {
    const shader = gl.createShader(type);
    if (shader) {
        gl.shaderSource(shader, shaderSource);
        gl.compileShader(shader);
        if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
            // console.error("Error compiling shader" + gl.getShaderInfoLog(shader));
            console.error(gl.getShaderInfoLog(shader))
            // throw new Error("Error compiling shader" + gl.getShaderInfoLog(shader))
            gl.deleteShader(shader);
        }
    }
    return shader;
}